// newtype
// 就是使用元组结构体的方式将已有的类型包裹起来：struct Meters(u32);
// 1 格式化输出 2 可读性 3 隐藏内部类型的细节

type Meters = u32; //类型别名(Type Alias) 编译器依然会把 Meters 当 u32 来使用
// 类型别名仅仅是别名，只是为了让可读性更好，并不是全新的类型，newtype 才是！
// 类型别名无法实现为外部类型实现外部特征等功能，而 newtype 可以

// !永不返回类型
#[cfg(test)]
mod alias_test_ {
    #[test]
    fn main() {
        // panic 的返回值是 !，代表它决不会返回任何值，既然没有任何返回值，那自然不会存在分支类型不匹配的情况。
        let i = 2;
        let v = match i {
            0..=3 => i,
            _ => {
                println!("不合规定的值:{}", i);
                1
            }
        };
    }
}

#[cfg(test)]
mod alias_test {
    type Thunk = Box<dyn Fn() + Send + 'static>;

    fn takes_long_type(f: Thunk) {}

    fn returns_long_type() -> Thunk {
        Box::new(|| println!("returns_long_type"))
    }

    #[test]
    fn main() {
        let f: Thunk = Box::new(|| println!("hi"));
    }
}

#[cfg(test)]
mod tests {
    use std::fmt;

    struct Wrapper(Vec<String>);

    // 格式化输出
    impl fmt::Display for Wrapper {
        fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
            write!(f, "[{}]", self.0.join(", "))
        }
    }

    #[test]
    fn main() {
        let w = Wrapper(vec![String::from("hello"), String::from("world")]);
        println!("w = {}", w);
    }
}
